도커(Docker) 시작하기

도커를 사용하기 위해서는 우선 이미지(Image)와 컨테이너(container)의 개념을 알아야 한다.

도커 이미지

도커 이미지는 가상 머신의 원본이 저장된 파일이라고 생각하면 이해하기 쉽다.

도커 이미지와 관련하여 많이 사용되는 명령어는 두 가지가 있다.

  • docker images : 현재 도커 이미지 목록 출력
  • docker rmi : 도커 이미지 삭제

docker images

우선 docker images 명령은 현재 파일 시스템에 저장된 도커 이미지 목록을 출력한다.

리눅스에서 도커를 사용하고 있다면 터미널을, 윈도우즈나 맥에서 도커 툴박스를 사용하고 있다면 Docker Quickstart Terminal을 시작한 후 다음과 같이 docker images 명령을 입력해 보자.

$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
datascienceschool/rpython   latest              758190f70e5e        6 days ago          7.711 GB
ubuntu                      latest              a1e4ed2ac65b        7 days ago          188 MB

현재 파일 시스템에 존재하는 모든 이미지의 목록을 보여준다. 여기에서 특정한 이미지를 지정하려면 첫번째 열의 REPOSITORYTAG를 콜론(:)으로 조합한 이미지 이름 문자열을 사용하든가 아니면 IMAGE ID열에 나타난 이미지 아이디를 사용해야 한다. 예를 들어 앞의 경우 datascienceschool/rpython:latest 이미지와 758190f70e5e 이미지는 같은 이미지를 가르킨다. 이미지 아이디를 사용하는 경우 중복된 아이디가 없다면 앞의 문자 일부분만 사용해도 된다. 예를 들어 758190f70e5e 대신 7581을 사용할 수도 있다. (7581로 시작하는 다른 아이디가 없는 경우)

docker rmi

만약 특정한 이미지를 삭제하고자 한다면 다음과 같이 docker rmi 뒤에 이미지 이름 문자열이나 이미지 아이디를 추가하여 입력한다.

$ docker rmi 758190f70e5e

만약 이미지를 삭제하려고 하는데 현재 해당 이미지를 복사한 컨테이너가 존재하거나 해당 이미지에 의존하는 다른 이미지가 존재하면 아래와 같이 오류 표시가 나타난다. 이 경우에는 해당 컨테이너 등을 삭제한 후 이미지를 삭제해야 한다.

$ docker rmi 758190f70e5e
Failed to remove image (758190f70e5e): Error response from daemon: conflict: unable to delete 758190f70e5e (must be forced) - image is being used by stopped container 3be34f7a1cb2

도커 컨테이너

도커 컨테이너는 이미지를 메모리 상에 올린 것이라고 생각하면 된다. 따라서 하나의 이미지에서 복수개의 컨테이너를 가동해도 된다. 이 경우에는 완전히 동일한 가상 컴퓨터가 복수 대 있는 것과 마찬가지가 된다.

도커 컨테이너와 관련하여 많이 사용되는 명령어는 다음과 같다.

  • docker ps -a : 현재 도커 컨테이너 목록 출력
  • docker run : 도커 컨테이너 가동
  • Ctrl+p, Ctrl+q : 가동 중인 도커 컨테이너에서 나오기
  • docker attach : 가동 중인 도커 컨테이너 안으로 들어가기
  • exit : 도커 컨테이너 중지 (컨테이너 내부에서)
  • docker stop : 도커 컨테이너 중지 (컨테이너 외부에서)
  • docker restart : 도커 컨테이너 재시작 (컨테이너 외부에서)
  • docker rm : 도커 컨테이너 삭제

docker ps -a

현재 존재하는 모든 도커 컨테이너 목록을 보려면 docker ps -a 명령을 사용한다. 만약 -a 옵션 없이 사용하면 가동중인 컨테이너만 보인다.

$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED    STATUS                      PORTS    NAMES
3be34f7a1cb2 datascienceschool/rpython "/usr/bin/tini" 5 days ago Exited (137) 15 minutes ago 8787/tcp rpython

도커 이미지와 마찬가지로 도커 컨테이너도 NAMES 열에 보인 컨테이너 이름 문자열과 CONTAINER ID 열에 보인 컨테이너 아이디로 특정 컨테이너를 지정할 수 있다. 컨테이너를 멈추거나 삭제하는 경우에 사용한다.

docker run

도커 컨테이너를 시작하려면 docker run 명령을 사용한다. 이 명령에는 많은 옵션이 오게 되는데 대표적인 옵션은 다음과 같다.

  • -it : 터미널을 가진 대화형으로 도커 컨테이너를 시작한다.
  • -d : 데몬(daemon)으로 도커 컨테이너를 시작한다.
  • --name : 컨테이너에 이름을 지정한다.
  • -p : 컨테이너와 호스트간의 포트 포워딩
  • -v : 컨테이너와 호스트간의 폴더 공유

옵션 다음에는 가동할 이미지의 이름과 수행할 명령을 추가한다.

예를 들어 datascienceschool/rpython 이미지를 대화형 컨테이너로 가동하는 경우 다음과 같이 입력할 수 있다.

docker run -it --name rpython -p 8888:8888 -p 8787:8787 datascienceschool/rpython

위 명령은 datascienceschool/rpython 이미지를 rpython이란 컨테이너 이름으로 가동시키며 터미널을 가진 대화형 컨테이너를 사용하고 컨테이의 8888 포트와 8787포트를 호스트의 8888 포트 및 8787 포트와 연결하라는 의미이다.

원래 docker run 명령은 마지막에 /bin/bash 등의 명령을 주지만 datascienceschool/rpython 이미지의 경우 아무런 명령이 없을 경우 자동으로 /bin/bash를 수행하도록 만들어져 있다. docker run 으로 /bin/bash 를 수행한 경우 다음과 같이 프롬프트가 바뀌며 도커 컨테이너 안으로 들어갔음을 보여준다.

$ docker run -it --name rpython -p 8888:8888 -p 8787:8787 datascienceschool/rpython
dockeruser@377ad03459bf:~$

앞의 프롬프트에서 dockeruser는 도커 컨테이너상의 사용자 아이디를, 377ad03459bf는 도커 컨테이너 아이디를 가리킨다.

Ctrl+p, Ctrl+q

도커 컨테이너 안에서 작업을 하다가 도커 컨테이너는 정지시키지 않고 잠시 컨테이너에서 호스트로 빠져나오고 싶은 경우에는 Ctrl+p, Ctrl+q 버튼을 누른다. (이 때 호스트 컴퓨터의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)

dockeruser@377ad03459bf:~$ Ctrl+p, Ctrl+q

user@user-PC MINGW64 ~

$

docker attach

호스트 컴퓨터에서 작업을 끝낸 후 다시 빠져나왔던 도커 컨테이너로 들어가려면 docker attach 명령을 입력한다. 물론 명령어 뒤에 컨테이너 아이디나 이름을 인수로 입력해야 한다. (마찬가지로 컨테이너의 프롬프트가 바로 나타나지 않으면 Enter키를 몇 번 친다.)

$ docker attach rpython
dockeruser@377ad03459bf:~$

exit

만약 컨테이너 사용을 완전히 마치고 싶으면 컨테이너 안에서 exit 명령을 입력한다. 컨테이너를 중지하고 호스트 컴퓨터로 빠져나온다.

dockeruser@377ad03459bf:~$ exit
exit
user@user-PC MINGW64 ~
$

docker stop

컨테이너를 중지하지 않고 빠져나온 경우에 외부에서 컨테이너를 중지하고 싶으면 docker stop 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS       PORTS                  NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 15 seconds ago Up 5 seconds 0.0.0.0:8787->8787/tcp rpython

user@user-PC MINGW64 ~
$ docker stop rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS                     PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 25 seconds ago Exited (143) 7 seconds ago       rpython

docker restart

컨테이너를 중지한 후에 다시 시작하고 싶으면 docker restart 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS                     PORTS NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 45 seconds ago Exited (143) 6 seconds ago       rpython

user@user-PC MINGW64 ~
$ docker restart rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID IMAGE                     COMMAND         CREATED        STATUS       PORTS                  NAMES
a181562ac4d8 datascienceschool/rpython "/usr/bin/tini" 57 seconds ago Up 5 seconds 0.0.0.0:8787->8787/tcp rpython

docker rm

컨테이너가 중지되었어도 컨테이너 자체는 계속 남아있기 때문에 같은 이름으로 컨테이너를 다시 생성하기 위해서는 해당 이름을 가진 컨테이너를 삭제해야 한다. 이 때 docker rm 명령을 사용한다.

user@user-PC MINGW64 ~
$ docker rm rpython
rpython

user@user-PC MINGW64 ~
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES